﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SIBI.Models;
using System.Web.Security;

namespace SIBI.Controllers
{
    [Authorize]
    public class TipoBienController : Controller
    {
        private SIBIContext db = new SIBIContext();

        //***********************************************************************************//
        // Autor:  										     		                		*//
		//***********************************************************************************//
		// Index()													 						*//
		// Función que devuelve la vista de todos los ítems de TipoBien listados en la 		*//
		// pantalla.																		*//
		// _________________________________________________________________________________*//
		// Entrada: None                                        							*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee todos los TipoBien listados.			 				*//
		// _________________________________________________________________________________*//
        [HttpGet]
        public PartialViewResult Index()
        {
            return PartialView(db.TipoBiens.ToList());
        }

        //***********************************************************************************//
        // Autor:  									                	     				*//
		//***********************************************************************************//
		// GetTipoBienes()																	*//
		// Función que devuelve la vista de todos los TipoBien del sitema	para asi		*// 
		//  listarlos en las funciones de autocompletado del sistema. 						*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	query: String llenado en el autocompletado, utilizado para buscar			*//
		// 		los TipoBien que coincidan en BD.	 										*//
		// _________________________________________________________________________________*//
		// Salida:  Arreglo que posee todos los TipoBien que conciden con el String de 		*//
		// busqueda.																		*//
		// _________________________________________________________________________________*//
        [HttpPost]
        public ActionResult GetTipoBienes(string query)
        {
			//Filtrado de los tipo de bien por los paremetros de entrada
            var tipobienes = (from m in db.TipoBiens
                               where (
                                  m.cnom.Contains(query) 
                               )
                               select new
                               {
                                   Nombre = m.cnom,
                                   TipoBienId = m.TipoBienId
                               }).ToArray();

            return Json(tipobienes);
        }

		//***********************************************************************************//
        // Autor:  										                     				*//
		//***********************************************************************************//
		// Details()	Acceso INVITADO	y ADMINISTRADOR										*//
		// Función que devuelve la vista de los detalles de un TipoBien especificado.	 	*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	id: identificador del TipoBien que se desea ver los detalles. 				*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee todos los datos del TipoBien desado.					*//
		// _________________________________________________________________________________*//
        public ViewResult Details(int id)
        {
            TipoBien tipobien = db.TipoBiens.Find(id);
            return View(tipobien);
        }

		//***********************************************************************************//
        // Autor:  								                		     				*//
		//***********************************************************************************//
		// Create()	Acceso solo ADMINISTRADOR												*//
		// Acción que devuelve la vista q permite crear un TipoBien especificado. Método GET*//
		// _________________________________________________________________________________*//
		// Entrada: 		none															*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee la plantilla para crear el TipoBien desado.				*//
		// _________________________________________________________________________________*//
        [Authorize(Roles="Admin")]
        public ActionResult Create()
        {
            return View();
        } 

		//***********************************************************************************//
        // Autor:  						                				     				*//
		//***********************************************************************************//
		// Create()	Acceso solo ADMINISTRADOR												*//
		// Acción que devuelve la vista que permite crear un TipoBien especificado. 		*//
		// Método POST.																		*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	tipobien: dato de tipo modelo, que representa un tipobien, este es requerido*//
		//		para verificar que los datos suministrados son correctos,  para así crear o *//
		//		enviar un mensaje de error en la aplicación.								*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que devuelve el TipoBien creado.									*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public ActionResult Create(TipoBien tipobien)
        {
            if (ModelState.IsValid)
            {
                db.TipoBiens.Add(tipobien);
                db.SaveChanges();
                return RedirectToAction("Index", "Estado");  
            }

            return View(tipobien);
        }

		//***********************************************************************************//
        // Autor:  								                		     				*//
		//***********************************************************************************//
		// Edit()	Acceso solo ADMINISTRADOR												*//
		// Acción que devuelve la vista q permite Editar un TipoBien especificado. 			*//
		// Método GET.																		*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	id: identificador del Tipo de Bien que se desea editar.						*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee la plantilla para Editar el TipoBien desado.			*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult Edit(int id)
        {
            TipoBien tipobien = db.TipoBiens.Find(id);
            return View(tipobien);
        }

		//***********************************************************************************//
        // Autor:  									                	     				*//
		//***********************************************************************************//
		// Edit()	Acceso solo ADMINISTRADOR												*//
		// Acción que devuelve la vista que permite Editar un TipoBien especificado. 		*//
		// Método POST.																		*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	tipobien: dato de tipo modelo, que representa un tipobien, este es requerido*//
		//		para verificar que los datos suministrados son correctos,  para así Editar o*//
		//		enviar un mensaje de error en la aplicación.								*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que devuelve el TipoBien Editado.									*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public ActionResult Edit(TipoBien tipobien)
        {
            if (ModelState.IsValid)
            {
                db.Entry(tipobien).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index", "Estado");
            }
            return View(tipobien);
        }

		//***********************************************************************************//
        // Autor:  										                     				*//
		//***********************************************************************************//
		// Delete()	Acceso solo ADMINISTRADOR												*//
		// Acción que devuelve la vista q permite Eliminar un TipoBien especificado. 		*//
		// Método GET.																		*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	id: identificador del Tipo de Bien que se desea Eliminar.					*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee la plantilla para Eliminar el TipoBien desado.			*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult Delete(int id)
        {
            TipoBien tipobien = db.TipoBiens.Find(id);
            return View(tipobien);
        }

		//***********************************************************************************//
        // Autor:  									                	     				*//
		//***********************************************************************************//
		// DeleteConfirmed()	Acceso solo ADMINISTRADOR									*//
		// Acción que devuelve la vista que permite elimininar un TipoBien especificado. 	*//
		// Método POST.																		*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	id: identificador del TipoBien que va a eliminar.							*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que muestra la eliminación del TipoBien desado.					*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {

            TipoBien tipobien = db.TipoBiens.Find(id);

            var bieninformatico = from m in db.BienInformaticoes
                                  where m.TipoBienId == tipobien.TipoBienId
                        select m.BienInformaticoId;
            if (bieninformatico.FirstOrDefault() == string.Empty)
            {
                db.TipoBiens.Remove(tipobien);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            else
            {
                return RedirectToAction("Confirmacion");
            }

        }
		
		//***********************************************************************************//
        // Autor:  									                	     				*//
		//***********************************************************************************//
		// Confirmacion()	Acceso solo ADMINISTRADOR										*//
		// Acción que devuelve la vista que informa si el TipoBien esta asociado a algún 	*//
		// BI.	Método GET.																	*//
		// _________________________________________________________________________________*//
		// Entrada: 	none																*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que devuelve la pantalla de asociación a un BI.					*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ViewResult Confirmacion()
        {

            return View();
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
}